package com.mode5.m4_routing;

import com.mode5.ConnectionUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 模式4：路由模式（Routing）
 * 生产者按routing key发送消息，不同的消费者端按不同的routing key接收消息。
 *
 * 消费者端 和 模式 3（发布订阅模式） 的区别：
 *  1、exchange的type为 direct
 *  2、发送消息的时候加入了 routing key
 *  在绑定queue和exchange的时候使用了路由routing key，即从该exchange上只接收routing key指定的消息。
 *
 *  //同一时刻服务器只发送1条消息给消费者（能者多劳，消费消息快的，会消费更多的消息）
 *  //保证在接收端一个消息没有处理完时不会接收另一个消息，即消费者端发送了ack后才会接收下一个消息。
 *  //在这种情况下生产者端会尝试把消息发送给下一个空闲的消费者。
 *  channel.basicQos(1);
 *
 *
 */
public class Producter {

    private final static String EXCHANGE_NAME = "routing_exchange";

    public static void main(String[] args) throws IOException, TimeoutException {
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();
        //声明交换机Exchange类型为direct
        channel.exchangeDeclare(EXCHANGE_NAME, "direct");

        //发布消息3种routingKey的消息
        String message = "hello info";
        channel.basicPublish(EXCHANGE_NAME, "info", null, message.getBytes());
        System.out.println("路由模式发布info消息："+message);

        message = "hello warning";
        channel.basicPublish(EXCHANGE_NAME, "warning", null, message.getBytes());
        System.out.println("路由模式发布warning消息："+message);

        message = "hello error";
        channel.basicPublish(EXCHANGE_NAME, "error", null, message.getBytes());
        System.out.println("路由模式发布error消息："+message);
    }
}
